package com.siao.starling.mvc.managers
{
	import com.siao.data.ArrayList;
	import com.siao.data.HashMap;
	import com.siao.errors.SingletonError;
	import com.siao.starling.mvc.Controller;
	import com.siao.starling.mvc.core.IContext;
	
	/**
	 * 控制器管理器
	 * @author SiaoLeon
	 */
	public class Controllers
	{
		// -------------------------------------------------------------------------------------------------------- 静态常量
		
		// -------------------------------------------------------------------------------------------------------- 静态变量
		
		private static var _instance:Controllers;
		
		/**
		 * 获取单例对象
		 */
		public static function get instance():Controllers
		{
			if (_instance == null)
			{
				_instance = new Controllers();
			}
			return _instance;
		}
		
		// -------------------------------------------------------------------------------------------------------- 静态方法
		
		// -------------------------------------------------------------------------------------------------------- 静态函数
		
		// -------------------------------------------------------------------------------------------------------- 属性
		
		// -------------------------------------------------------------------------------------------------------- 变量
		
		private var controllers:HashMap;
		
		// -------------------------------------------------------------------------------------------------------- 构造
		
		/**
		 * 构造函数，单例模式
		 */
		public function Controllers()
		{
			if (_instance != null)
			{
				throw new SingletonError(this);
			}
			_instance = this;
			
			this.init();
		}
		
		// -------------------------------------------------------------------------------------------------------- 方法
		
		/**
		 * 添加控制器
		 * @param conroller 控制器对象
		 */
		public function add(controller:Controller):void
		{
			if (!this.controllers.containsKey(controller.context))
			{
				this.controllers.put(controller.context, new ArrayList());
			}
			
			var list:ArrayList = this.controllers.getValue(controller.context);
			
			if (!list.contains(controller))
			{
				list.add(controller);
			}
		}
		
		/**
		 * 移除控制器
		 * @param controller 控制器对象
		 */
		public function remove(controller:Controller):void
		{
			if (!this.controllers.containsKey(controller.context))
			{
				return;
			}
			
			var list:ArrayList = this.controllers.getValue(controller.context);
			
			if (list.contains(controller))
			{
				controller.clear();
				list.remove(controller);
			}
		}
		
		/**
		 * 获取控制器列表
		 * @param context 指定的上下文关联对象
		 */
		public function getControllers(context:IContext):ArrayList
		{
			return this.controllers.getValue(context);
		}
		
		// -------------------------------------------------------------------------------------------------------- 函数
		
		/**
		 * 初始化
		 */
		private function init():void
		{
			this.controllers = new HashMap();
		}
	
	}
}
